;; 清空framebuffer
;; 清空整个64x64的帧缓冲区，将所有像素设置为空格字符

;; 主程序入口
main:
    ;; 清空画布 - 用循环清空整个屏幕
    PUSH 0           ; 初始y=0
    clear_y_loop:
    PUSH 0           ; 初始x=0
    clear_x_loop:
    
    ;; 设置当前坐标的字符为空格(32) - 参数顺序: x, y, char
    DUP              ; 复制x
    SWAP             ; 交换x和y，现在栈顶是y
    OVER             ; 复制x，现在栈顶是x
    PUSH 32          ; 空格字符
    SETU             ; 设置字符
    
    ;; x加1
    PUSH 1
    ADD
    
    ;; 检查x是否小于64
    DUP
    PUSH 64
    LT
    JUMPIF clear_x_loop  ; 如果x<64，继续内层循环
    
    ;; x循环结束，y加1
    POP              ; 弹出x
    SWAP             ; 交换，让y在栈顶
    PUSH 1
    ADD
    DUP              ; 复制y
    PUSH 64
    LT
    JUMPIF clear_y_loop  ; 如果y<64，继续外层循环
    
    POP              ; 弹出y
    
    ;; 清空完成，显示确认信息
    PUSH 25          ; x坐标
    PUSH 30          ; y坐标
    PUSH #x5B        ; '[' 字符
    SETU
    
    PUSH 26          ; x坐标
    PUSH 30          ; y坐标
    PUSH #x4F        ; 'O' 字符
    SETU
    
    PUSH 27          ; x坐标
    PUSH 30          ; y坐标
    PUSH #x4B        ; 'K' 字符
    SETU
    
    PUSH 28          ; x坐标
    PUSH 30          ; y坐标
    PUSH #x5D        ; ']' 字符
    SETU
    
    PUSH 30          ; x坐标
    PUSH 30          ; y坐标
    PUSH #x53        ; 'S' 字符
    SETU
    
    PUSH 31          ; x坐标
    PUSH 30          ; y坐标
    PUSH #x43        ; 'C' 字符
    SETU
    
    PUSH 32          ; x坐标
    PUSH 30          ; y坐标
    PUSH #x52        ; 'R' 字符
    SETU
    
    PUSH 33          ; x坐标
    PUSH 30          ; y坐标
    PUSH #x45        ; 'E' 字符
    SETU
    
    PUSH 34          ; x坐标
    PUSH 30          ; y坐标
    PUSH #x45        ; 'E' 字符
    SETU
    
    PUSH 35          ; x坐标
    PUSH 30          ; y坐标
    PUSH #x4E        ; 'N' 字符
    SETU
    
    HALT

;; 清空屏幕函数（可被其他程序调用）
;; 参数：无
clear_screen:
    PUSH 0           ; 初始y=0
    clear_screen_y_loop:
    PUSH 0           ; 初始x=0
    clear_screen_x_loop:
    
    ;; 设置当前坐标的字符为空格(32)
    DUP              ; 复制x
    SWAP             ; 交换x和y，现在栈顶是y
    OVER             ; 复制x，现在栈顶是x
    PUSH 32          ; 空格字符
    SETU             ; 设置字符
    
    ;; x加1
    PUSH 1
    ADD
    
    ;; 检查x是否小于64
    DUP
    PUSH 64
    LT
    JUMPIF clear_screen_x_loop  ; 如果x<64，继续内层循环
    
    ;; x循环结束，y加1
    POP              ; 弹出x
    SWAP             ; 交换，让y在栈顶
    PUSH 1
    ADD
    DUP              ; 复制y
    PUSH 64
    LT
    JUMPIF clear_screen_y_loop  ; 如果y<64，继续外层循环
    
    POP              ; 弹出y
    RET

;; 快速清空函数（优化版本，使用更大的步长）
;; 参数：无
fast_clear_screen:
    PUSH 0           ; 初始y=0
    fast_clear_y_loop:
    PUSH 0           ; 初始x=0
    fast_clear_x_loop:
    
    ;; 一次设置4个像素（优化性能）
    DUP              ; 复制x
    SWAP             ; 交换x和y
    OVER             ; 复制x
    PUSH 32          ; 空格字符
    SETU             ; 设置字符
    
    ;; 设置第二个像素
    OVER             ; 复制x
    PUSH 1
    ADD
    SWAP             ; 交换x和y
    OVER             ; 复制x+1
    PUSH 32          ; 空格字符
    SETU             ; 设置字符
    
    ;; 设置第三个像素
    OVER             ; 复制x
    PUSH 2
    ADD
    SWAP             ; 交换x和y
    OVER             ; 复制x+2
    PUSH 32          ; 空格字符
    SETU             ; 设置字符
    
    ;; 设置第四个像素
    OVER             ; 复制x
    PUSH 3
    ADD
    SWAP             ; 交换x和y
    OVER             ; 复制x+3
    PUSH 32          ; 空格字符
    SETU             ; 设置字符
    
    ;; x加4
    PUSH 4
    ADD
    
    ;; 检查x是否小于64
    DUP
    PUSH 64
    LT
    JUMPIF fast_clear_x_loop  ; 如果x<64，继续内层循环
    
    ;; x循环结束，y加1
    POP              ; 弹出x
    SWAP             ; 交换，让y在栈顶
    PUSH 1
    ADD
    DUP              ; 复制y
    PUSH 64
    LT
    JUMPIF fast_clear_y_loop  ; 如果y<64，继续外层循环
    
    POP              ; 弹出y
    RET

;; 清空指定区域函数
;; 参数：start_x, start_y, width, height
clear_region:
    ;; 保存参数
    SWAP             ; 保存height
    SWAP             ; 保存width
    SWAP             ; 保存start_y
    SWAP             ; 保存start_x
    
    ;; 计算结束坐标
    OVER             ; 复制start_x
    OVER             ; 复制width
    ADD              ; start_x + width
    SWAP             ; 保存end_x
    
    OVER             ; 复制start_y
    OVER             ; 复制height
    ADD              ; start_y + height
    SWAP             ; 保存end_y
    
    ;; 外层循环：y坐标
    OVER             ; 复制start_y
    clear_region_y_loop:
    DUP              ; 复制当前y
    OVER             ; 复制end_y
    LT               ; 当前y < end_y
    JUMPIF clear_region_x_loop_setup
    JUMP clear_region_done
    
    clear_region_x_loop_setup:
    OVER             ; 复制start_x
    clear_region_x_loop:
    DUP              ; 复制当前x
    OVER             ; 复制end_x
    LT               ; 当前x < end_x
    JUMPIF clear_region_set_pixel
    JUMP clear_region_x_done
    
    clear_region_set_pixel:
    ;; 设置当前像素为空格
    DUP              ; 复制x
    SWAP             ; 交换x和y
    OVER             ; 复制x
    PUSH 32          ; 空格字符
    SETU             ; 设置字符
    
    ;; x加1
    PUSH 1
    ADD
    JUMP clear_region_x_loop
    
    clear_region_x_done:
    POP              ; 弹出x
    
    ;; y加1
    SWAP             ; 交换x和y
    PUSH 1
    ADD
    SWAP             ; 交换回
    JUMP clear_region_y_loop
    
    clear_region_done:
    POP              ; 弹出y
    POP              ; 弹出end_y
    POP              ; 弹出end_x
    POP              ; 弹出height
    POP              ; 弹出width
    POP              ; 弹出start_y
    POP              ; 弹出start_x
    RET